﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ParasitoLibrary.Core.Entidade;
using ParasitoQuizApplication.Business.Fachada;

namespace ParasitoQuizApplication.UserInterface
{
    public partial class FormularioPrincipal : Form
    {
        private Questoes questoes = null;
        private int indicePerguntaAtual = 0;
        private Boolean quizFinalizado = false;

        public FormularioPrincipal()
        {
            InitializeComponent();

            this.configurarCBBs();
            this.desabilitarFormularioQuiz();
        }

        private void configurarCBBs()
        {
            IList<Nivel> listaNiveis = FachadaParasitoQuiz.getInstancia().carregarNiveis();
            IList<Assunto> listaAssunto = FachadaParasitoQuiz.getInstancia().carregarAssuntos();

            this.cbbNivel.DataSource = listaNiveis;
            this.cbbNivel.DisplayMember = "Nome";
            this.cbbNivel.ValueMember = "Codigo";

            this.cbbAssunto.DataSource = listaAssunto;
            this.cbbAssunto.DisplayMember = "Nome";
            this.cbbAssunto.ValueMember = "Codigo";

            this.cbbNivel.SelectedItem = null;
            this.cbbAssunto.SelectedItem = null;
        }

        private void habilitarFormularioQuiz()
        {
            this.habilitarDesabilitarFormulario(false);
        }

        private void desabilitarFormularioQuiz()
        {
            this.habilitarDesabilitarFormulario(true);
        }

        private void habilitarDesabilitarFormulario(Boolean condicao)
        {
            this.lblNivel.Enabled = condicao;
            this.lblAssunto.Enabled = condicao;

            this.cbbNivel.Enabled = condicao;
            this.cbbAssunto.Enabled = condicao;

            this.btnIniciarQUIZ.Enabled = condicao;

            this.lblPergunta.Enabled = !condicao;
            this.lblTotalCorretas.Enabled = !condicao;
            this.lblValorTotalCorretas.Enabled = !condicao;
            this.lblTotalErradas.Enabled = !condicao;
            this.lblValorTotalErradas.Enabled = !condicao;
            this.lblTotalNaoRespondidas.Enabled = !condicao;
            this.lblValorTotalNaoRespondidas.Enabled = !condicao;
            this.lblIndice.Enabled = !condicao;
            this.lblValorIndice.Enabled = !condicao;
            this.lblResposta1.Enabled = !condicao;
            this.lblResposta2.Enabled = !condicao;
            this.lblResposta3.Enabled = !condicao;
            this.lblResposta4.Enabled = !condicao;
            this.lblResposta5.Enabled = !condicao;

            this.gpbCorreta.Enabled = !condicao;

            this.btnPrimeira.Enabled = !condicao;
            this.btnAnterior.Enabled = !condicao;
            this.btnFinalizarQUIZ.Enabled = !condicao;
            this.btnProxima.Enabled = !condicao;
            this.btnUltima.Enabled = !condicao;

            this.limparSelecaoRespostaPerguntas();
        }

        private void limparSelecaoRespostaPerguntas()
        {
            this.rdbResposta1.Checked = false;
            this.rdbResposta2.Checked = false;
            this.rdbResposta3.Checked = false;
            this.rdbResposta4.Checked = false;
            this.rdbResposta5.Checked = false;
        }

        private void cbbNivel_SelectionChangeCommitted(object sender, EventArgs e)
        {
            this.calcularTotalPerguntasDisponiveis();
        }

        private void cbbAssunto_SelectionChangeCommitted(object sender, EventArgs e)
        {
            this.calcularTotalPerguntasDisponiveis();
        }

        private void calcularTotalPerguntasDisponiveis()
        {
            Nivel nivel = null;
            Assunto assunto = null;
            int valorTotalPerguntasDisponiveis = 0;

            if (this.cbbNivel.SelectedItem != null && this.cbbAssunto.SelectedItem != null)
            {
                nivel = (Nivel)this.cbbNivel.SelectedItem;
                assunto = (Assunto)this.cbbAssunto.SelectedItem;

                valorTotalPerguntasDisponiveis = FachadaParasitoQuiz.getInstancia().calcularTotalPerguntas(nivel, assunto);                                
            }

            this.lblValorTotalPerguntas.Text = valorTotalPerguntasDisponiveis.ToString();
        }

        private void btnIniciar_Click(object sender, EventArgs e)
        {
            this.iniciarQuiz();
            
        }

        private void iniciarQuiz()
        {
            this.quizFinalizado = false;

            if (this.cbbNivel.SelectedItem == null || this.cbbAssunto.SelectedItem == null)
            {
                MessageBox.Show(this, "É necessário selecionar um nível e um assunto!");
            }
            else
            {
                this.lblValorTotalCorretas.Text = "00";
                this.lblValorTotalErradas.Text = "00";
                this.lblValorTotalNaoRespondidas.Text = "00";

                this.habilitarFormularioQuiz();

                Nivel nivel = null;
                Assunto assunto = null;
                nivel = (Nivel)this.cbbNivel.SelectedItem;
                assunto = (Assunto)this.cbbAssunto.SelectedItem;

                this.questoes = FachadaParasitoQuiz.getInstancia().carregarQuestoes(nivel, assunto);
                this.indicePerguntaAtual = 0;
                this.atualizarLabelIndicePerguntaAtual();
                this.atualizarFormularioPerguntaAtual();
            }
            
        }

        private Questao obterPerguntaAtual()
        {
            Questao perguntaAtual = null;

            perguntaAtual = this.questoes.ListaQuestao.ElementAt(this.indicePerguntaAtual);

            return perguntaAtual;
        }

        private void atualizarFormularioPerguntaAtual()
        {
            this.txbEnunciado.Text = this.obterPerguntaAtual().Enunciado;
            this.rdbResposta1.Checked = false;
            this.rdbResposta2.Checked = false;
            this.rdbResposta3.Checked = false;
            this.rdbResposta4.Checked = false;
            this.rdbResposta5.Checked = false;

            foreach (Resposta resposta in this.obterPerguntaAtual().ListaRespostas)
            {
                switch (resposta.Ordem)
                {
                    case 1 :
                        this.txbResposta1.Text = resposta.Conteudo;
                        //if (resposta.Correta) this.txbResposta1.Text += " CORRETA";
                        this.atualizarLblRespostaQUIZFinalizado(this.lblResposta1, this.obterPerguntaAtual(), resposta);
                        break;
                    case 2:
                        this.txbResposta2.Text = resposta.Conteudo;
                        //if (resposta.Correta) this.txbResposta2.Text += " CORRETA";
                        this.atualizarLblRespostaQUIZFinalizado(this.lblResposta2, this.obterPerguntaAtual(), resposta);
                        break;
                    case 3:
                        this.txbResposta3.Text = resposta.Conteudo;
                        //if (resposta.Correta) this.txbResposta3.Text += " CORRETA";
                        this.atualizarLblRespostaQUIZFinalizado(this.lblResposta3, this.obterPerguntaAtual(), resposta);
                        break;
                    case 4:
                        this.txbResposta4.Text = resposta.Conteudo;
                        //if (resposta.Correta) this.txbResposta4.Text += " CORRETA";
                        this.atualizarLblRespostaQUIZFinalizado(this.lblResposta4, this.obterPerguntaAtual(), resposta);
                        break;
                    case 5:
                        this.txbResposta5.Text = resposta.Conteudo;
                        //if (resposta.Correta) this.txbResposta5.Text += " CORRETA";
                        this.atualizarLblRespostaQUIZFinalizado(this.lblResposta5, this.obterPerguntaAtual(), resposta);
                        break;
                }
            }

            if (this.obterPerguntaAtual().NumeroOpcaoEscolhida != 0)
            {
                switch (this.obterPerguntaAtual().NumeroOpcaoEscolhida)
                {
                    case 1:
                        this.rdbResposta1.Checked = true;
                        break;
                    case 2:
                        this.rdbResposta2.Checked = true;
                        break;
                    case 3:
                        this.rdbResposta3.Checked = true;
                        break;
                    case 4:
                        this.rdbResposta4.Checked = true;
                        break;
                    case 5:
                        this.rdbResposta5.Checked = true;
                        break;
                }
            }
        }

        private void atualizarLblRespostaQUIZFinalizado(Label lblResposta, Questao questao, Resposta resposta)
        {
            
            //txbResposta.BackColor = this.txbEnunciado.BackColor;
            lblResposta.ForeColor = this.txbEnunciado.ForeColor;

            if (this.quizFinalizado)
            {
                if (resposta.Correta) 
                {
                    //txbResposta.BackColor = Color.Blue;
                    lblResposta.ForeColor = Color.Blue;
                }

                if (questao.NumeroOpcaoEscolhida == resposta.Ordem)
                {
                    if (questao.respondidaCorretamente())
                    {
                        lblResposta.ForeColor = Color.Green;
                    }
                    else
                    {
                        lblResposta.ForeColor = Color.Red;
                    }

                    //txbResposta.ForeColor = Color.White;
                }
            }
        }

        private void atualizarLabelIndicePerguntaAtual()
        {
            if (indicePerguntaAtual < 10)
            {
                this.lblValorIndice.Text = "0" + (this.indicePerguntaAtual + 1).ToString();
            }
            else
            {
                this.lblValorIndice.Text = (this.indicePerguntaAtual + 1).ToString();
            }
        }

        private void atualizarLabelTotalCorretas(int total)
        {
            if (total < 10)
            {
                this.lblValorTotalCorretas.Text = "0" + total.ToString();
            }
            else
            {
                this.lblValorTotalCorretas.Text = total.ToString();
            }
        }

        private void atualizarLabelTotalErradas(int total)
        {
            if (total < 10)
            {
                this.lblValorTotalErradas.Text = "0" + total.ToString();
            }
            else
            {
                this.lblValorTotalErradas.Text = total.ToString();
            }
        }

        private void atualizarLabelTotalNaoRespondidas(int total)
        {
            if (total < 10)
            {
                this.lblValorTotalNaoRespondidas.Text = "0" + total.ToString();
            }
            else
            {
                this.lblValorTotalNaoRespondidas.Text = total.ToString();
            }
        }

        private void btnFinalizarQUIZ_Click(object sender, EventArgs e)
        {
            this.atualizarFormularioQuizFinalizado();
            this.contabilizarQUIZ();
            this.atualizarFormularioPerguntaAtual();
            MessageBox.Show(this, "Quiz finalizado, atente para as estatísticas acima da pergunta e navegue pelo formulário para verificar cada pergunta individualmente!");
        }

        private void contabilizarQUIZ()
        {
            int totalRespostasCorretas = 0;
            int totalRepostasErradas = 0;
            int totalRespostasNaoRespondidas = 0;

            this.quizFinalizado = true;

            foreach (Questao questao in this.questoes.ListaQuestao)
            {

                if (questao.NumeroOpcaoEscolhida == 0)
                {
                    totalRespostasNaoRespondidas += 1;
                }
                else
                {
                    if (questao.respondidaCorretamente())
                    {
                        totalRespostasCorretas += 1;
                    }
                    else
                    {
                        totalRepostasErradas += 1;
                    }
                }
            }

            this.atualizarLabelTotalCorretas(totalRespostasCorretas);
            this.atualizarLabelTotalErradas(totalRepostasErradas);
            this.atualizarLabelTotalNaoRespondidas(totalRespostasNaoRespondidas);
        }

        private void atualizarFormularioQuizFinalizado()
        {
            this.desabilitarFormularioQuiz();
            this.lblResposta1.Enabled = false;
            this.lblResposta2.Enabled = false;
            this.lblResposta3.Enabled = false;
            this.lblResposta4.Enabled = false;
            this.lblResposta5.Enabled = false;

            this.gpbCorreta.Enabled = false;

            this.btnPrimeira.Enabled = true;
            this.btnAnterior.Enabled = true;
            this.btnFinalizarQUIZ.Enabled = false;
            this.btnProxima.Enabled = true;
            this.btnUltima.Enabled = true;

            this.lblPergunta.Enabled = true;
            this.lblTotalCorretas.Enabled = true;
            this.lblValorTotalCorretas.Enabled = true;
            this.lblTotalErradas.Enabled = true;
            this.lblValorTotalErradas.Enabled = true;
            this.lblTotalNaoRespondidas.Enabled = true;
            this.lblValorTotalNaoRespondidas.Enabled = true;
            this.lblIndice.Enabled = true;
            this.lblValorIndice.Enabled = true;
            this.lblResposta1.Enabled = true;
            this.lblResposta2.Enabled = true;
            this.lblResposta3.Enabled = true;
            this.lblResposta4.Enabled = true;
            this.lblResposta5.Enabled = true;
        }

        private void btnPrimeira_Click(object sender, EventArgs e)
        {
            this.indicePerguntaAtual = 0;
            this.atualizarLabelIndicePerguntaAtual();
            this.atualizarFormularioPerguntaAtual();
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            if ( this.indicePerguntaAtual >= 1 ) {
                this.indicePerguntaAtual = this.indicePerguntaAtual - 1;
                this.atualizarLabelIndicePerguntaAtual();
                this.atualizarFormularioPerguntaAtual();
            }
        }

        private void btnProxima_Click(object sender, EventArgs e)
        {
            if (this.indicePerguntaAtual <= (this.questoes.ListaQuestao.Count - 2))
            {
                this.indicePerguntaAtual = this.indicePerguntaAtual + 1;
                this.atualizarLabelIndicePerguntaAtual();
                this.atualizarFormularioPerguntaAtual();
            }
        }

        private void btnUltima_Click(object sender, EventArgs e)
        {
            this.indicePerguntaAtual = this.questoes.ListaQuestao.Count - 1;
            this.atualizarLabelIndicePerguntaAtual();
            this.atualizarFormularioPerguntaAtual();
        }

        private void rdbResposta1_CheckedChanged(object sender, EventArgs e)
        {
            if (this.rdbResposta1.Checked)
            {
                this.atualizarRespostaPergunta(1);
            }
        }

        private void rdbResposta2_CheckedChanged(object sender, EventArgs e)
        {
            if (this.rdbResposta2.Checked)
            {
                this.atualizarRespostaPergunta(2);
            }
        }

        private void rdbResposta3_CheckedChanged(object sender, EventArgs e)
        {
            if (this.rdbResposta3.Checked)
            {
                this.atualizarRespostaPergunta(3);
            }
        }

        private void rdbResposta4_CheckedChanged(object sender, EventArgs e)
        {
            if (this.rdbResposta4.Checked)
            {
                this.atualizarRespostaPergunta(4);
            }
        }

        private void rdbResposta5_CheckedChanged(object sender, EventArgs e)
        {
            if (this.rdbResposta5.Checked)
            {
                this.atualizarRespostaPergunta(5);
            }
        }

        private void atualizarRespostaPergunta(int ordemPerguntaSelecionada)
        {
            this.obterPerguntaAtual().NumeroOpcaoEscolhida = ordemPerguntaSelecionada;
        }
    }
}